<?php if (!defined('BASEPATH')) exit('No permitir el acceso directo al script');


class Sesion {

	var $nombre_sesion = 'cms_restos';

	var $flag_login = 'logueado';

	function Sesion() {

		// Garbage collector que tarde 2 horas en borrar.
		//ini_set("session.gc_maxlifetime","7200");
		ini_set('session.gc_maxlifetime',14400);
		ini_set('session.gc_probability',1);
		ini_set('session.gc_divisor',1);
		
		/* La siguiente sentencia funciona, pero cuando se supera los 25 min
		 * hay otra variable en el servidor de arriba que elimina la session antes.
		 */
		//session_set_cookie_params(14400);
		//session_set_cookie_params(60); // 1 Min 
		
		
	}

	/**
	 * Define el Nombre de la Sesion
	 * @param $nombre
	 * @return unknown_type
	 */
	function setNombreSesion($nombre)
	{
		$this->nombre_sesion = $nombre;
	}

	/**
	 * Obtiene el Nombre de la Sesion
	 * 
	 * @return String
	 */
	function getNombreSesion()
	{
		return $this->nombre_sesion;
	}
	/**
	 * Inicia la sesion.
	 * @return unknown_type
	 */
	function iniciar_sesion()
	{
		session_name($this->nombre_sesion);
		if (session_id() == '') {
			session_start();
			$params = session_get_cookie_params();
			//echo '<body>';
			//print_r($params);
			setcookie($this->getNombreSesion(), session_id(), time() + 3600, // 1 Hora
				$params["path"], $params["domain"],
				$params["secure"], $params["httponly"]);
		} else {
			//$params = session_get_cookie_params();
			//echo '<body>';
			//echo 'nooooo:';
			//print_r($params);
			
		}
		//exit();
	}

	/**
	 * Define el valor de una variable en la sesion.
	 * @param $key
	 * @param $value
	 * @return unknown_type
	 */
	function set_userdata($key, $value)
	{
		$this->iniciar_sesion();
		$_SESSION[$key] = $value;
	}

	/**
	 * Elimina el valor de una variable en la sesion.
	 * @param $key
	 * @return unknown_type
	 */
	function unset_userdata($key)
	{
		$this->iniciar_sesion();
		unset($_SESSION[$key]);
	}

	/**
	 * Recupera datos de la sesion
	 * Si no se especifica un parametro
	 * se devuelve todo los datos de la
	 * sesion.
	 * Si no se encuentra seteado devuelve $false
	 * @param $key
	 * @param $false
	 * @return unknown_type
	 */
	function userdata($key = NULL, $false = NULL)
	{
		$this->iniciar_sesion();
		if (isset($key)) {
			$result = isset($_SESSION[$key])?$_SESSION[$key]:$false;
			return $result;
		}
		/*
		if (isset($key)) {
			$this->iniciar_sesion();
			$result = isset($_SESSION[$key])?$_SESSION[$key]:NULL;
			if (isset($subKey)) {
				$result = isset($result[$subKey])?$result[$subKey]:NULL;
			}
			return $result;
		}*/
		return $_SESSION;
	}

	/**
	 * Verifica si una variable esta seteada en la sesion.
	 * @param $key
	 * @return unknown_type
	 */
	function isset_userdata($key){
		return isset($_SESSION[$key])?true:false;
	}



	/**
	 * Recupera datos de la variable de session
	 * que se solicita
	 * Si no existe lo que se pide devuelve falso
	 * $keys = array('key','subkey','subsubkey',etc)
	 * @param $keys
	 * @return unknown_type
	 */
	function existe($keys = array()) // TODO: Hay que cambiarle ese nombre!
	{
		$laInfo = isset($_SESSION)?$_SESSION:0;

		foreach($keys as $key) {
			$laInfo = isset($laInfo[$key])?$laInfo[$key]:0;
		}

		return $laInfo;

	}


	function sess_destroy()
	{
		$this->iniciar_sesion();
		unset($_SESSION);
		$params = session_get_cookie_params();
		setcookie($this->getNombreSesion(), '', time() - 42000,
        	$params["path"], $params["domain"],
       		$params["secure"], $params["httponly"]);
		session_destroy();
	}

	/**
	 * Verificar si el usuario esta autentificado.
	 */
	function sesion_valida()
	{
		$result = $this->userdata($this->flag_login);
		if (empty($result)) {
			return false;
		}
		return $result;
			
	}

	/**
	 * Autentificar Sesion
	 */
	function validar_sesion()
	{
		$this->set_userdata($this->flag_login,true);
	}


	/**
	 * Desautentificar Sesion
	 */
	function invalidar_sesion()
	{
		$this->set_userdata($this->flag_login,false);
		
		//setcookie($this->getNombreSesion(), '', time() - 42000);
		// Destruir la session ?? quizas no es necesario.
		$this->sess_destroy();
		
	}

	/**
	 * devuelve la sesion id asignada al usuario
	 */
	function get_sesionid($falso = '')
	{
		if (($valor = session_id()) != '' ) {
			return $valor;
		} else {
			return $falso;
		}
	}

}
?>
